// JWT的组成部分
// JWT通常由三部分组成。分别是Header (头部)、Payload (有效荷载)、Signature (签名) .
// 三者之间使用英文的"." 分隔，格式如下:
// Header.Pylod.signatuore

// 安装JWT相关的两个包
// npm i jsonwebtoken :用于生成JWT字符串
// npm i express-jwt :将JWT字符串解析还原成JSON对象 express-jwt要安装5.3.3版本，不然会报错。

// 定义secret密钥
// 为了保证JWT字符串的安全性，防止JWT字符串在网络传输过程中被别人破解，我们需要专门定义一个用于加密和解密的secret密钥: .
// 1.当生成JWT字符串的时候，需要使用secret密钥对用户的信息进行加密，最终得到加密好的JWT字符串
// 2.当把JWT字符串解析还原成JSON对象的时候，需要使用secret密钥进行解密

// 在登录成功后生成JWT字符串
// 调用jsonwebtoken包提供的sign()方法，将用户的信息加密成JWT字符串,响应给客户端:
// const tokenStr = jwt.sign({ username: userinfo.username }, secretKey, { expiresIn: '800s' })
// 参数一：用户信息对象
// 参数二：加密的密钥（secret）
// 参数三：配置token的有效期

// 将JWT字符串还原为JSON对象
// 客户端每次在访问那些有权限接口的时候，都需要主动通过请求头中的Authorization字段，将Token字符串发送到服务器进行身份认证。
// 此时，服务器可以通过express-jwt这个中间件，自动将客户端发送过来的Token解析还原成JSON对象
// app.use(expressJWT({ secret: secretKey }).unless({ path: [/^\/api\//] }))
// expressJwT({ secret: secretKey })   { secret: secretKey }就是用来解析Token 的密钥
// .unless({ path: [/^\/api\//]}) 用来指定哪些接口不需要访问权
// 注意：只要配置成功了express-jwt这个中间件，就可以把解析出来的用户信息自动挂载到req.user属性上

// 捕获解析JWT失败后产生的错误
// 当使用express-jwt解析Token字符串时，如果客户端发送过来的Token字符串过期或不合法，会产生-个解析失败
// 的错误，影响项目的正常运行。我们可以通过Express 的错误中间件，捕获这个错误并进行相关的处理，示例代码如下:
// app.use((err, req, res, next) => {
//     // token 解析失败导致的错误
//     if (err.name === 'UnauthorizedError') {
//         return res.send({ status: 401, message: '无效的token' })
//     }
//     //其它原因导致的错误
//     res.send({ status: 500, message: '未知错误' })
// })
